package com.yanqu.road.logic.helper;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

public class MathHelper {

    /**
     * 计算方差
     */
    public static BigDecimal calcVariance(List<BigInteger> valueList) {
        if (valueList == null || valueList.size() == 0) {
            return BigDecimal.ZERO;
        }

        // 公式：S^2 = (1/N) * [ (X1-X)^2 + (X2-X)^2 + ... + (Xn-X)^2 ]

        BigInteger sum = BigInteger.ZERO;
        for (BigInteger value : valueList) {
            sum = sum.add(value);
        }
        BigDecimal avg = new BigDecimal(sum).divide(BigDecimal.valueOf(valueList.size()), 15, BigDecimal.ROUND_HALF_UP); // X

        BigDecimal part1 = BigDecimal.ZERO;
        for (BigInteger value : valueList) {
            BigDecimal part2 = new BigDecimal(value).subtract(avg); // Xn - X
            BigDecimal part3 = part2.multiply(part2); // (Xn - X)^2
            part1 = part1.add(part3); // [ (X1-X)^2 + (X2-X)^2 ]
        }

        return part1.divide(BigDecimal.valueOf(valueList.size()), 10, BigDecimal.ROUND_HALF_UP); // (1/N) * [ (X1-X)^2 + (X2-X)^2 ]
    }

}
